package cn.demoncat.util.lang;

import cn.demoncat.util.exception.ParamRuntimeException;
import cn.demoncat.util.lang.constant.AllowCodeConstant;

/**
 * 授权码工具
 * 
 * @author 延晓磊
 *
 * @since 2017年10月24日
 */
public final class AllowCodeUtil {

	/**
	 * 判断是否为有效的授权码
	 * 
	 * @param code
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年10月24日
	 */
	public static boolean isAllowCode(String code) {
		// 0，1，3，5，7
		return code.length() == 1 && AllowCodeConstant.Code.ANY.contains(code);
	}

	/**
	 * 判断是否为团队授权码
	 * 
	 * @param code
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年10月24日
	 */
	public static boolean isTeamAllowCode(String code) {
		if (code.length() != 3) {
			return false;
		}
		// 0，1，3，5，7 && 左侧大于右侧
		int a = 1;
		int b;
		String tmp;
		for (int i = 0; i < 3; i++) {
			tmp = String.valueOf(code.charAt(i));
			if (!AllowCodeConstant.Code.ANY.contains(tmp)) {
				return false;
			}
			b = Integer.parseInt(tmp);
			if (b < a) {
				return false;
			}
			a = b;
		}
		return true;
	}

	/**
	 * 判断是否有单元权限
	 * 
	 * @param src
	 *            源权限码
	 * @param desc
	 *            目标权限码
	 * @return 源权限码中是否有目标权限
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年10月24日
	 */
	public static boolean hasAllow(String src, String desc) {
		// 不需要权限
		if (desc.equals(AllowCodeConstant.Code.NONE)) {
			return true;
		}
		// 权限校验
		switch (desc) {
		case AllowCodeConstant.Code.READ:
			// 读权限 > 0
			return Integer.parseInt(src) > AllowCodeConstant.CodeNum.NONE;
		case AllowCodeConstant.Code.WRITE:
		case AllowCodeConstant.Code.READ_WRITE:
			// 写权限 == 2|3|7
			return src.equals(AllowCodeConstant.Code.WRITE) || src.equals(AllowCodeConstant.Code.READ_WRITE)
					|| src.equals(AllowCodeConstant.Code.ALL);
		case AllowCodeConstant.Code.DELETE:
		case AllowCodeConstant.Code.READ_DELETE:
			// 删权限 == 4|5|7
			return src.equals(AllowCodeConstant.Code.DELETE) || src.equals(AllowCodeConstant.Code.READ_DELETE)
					|| src.equals(AllowCodeConstant.Code.ALL);
		case AllowCodeConstant.Code.ALL:
			// 全权限 == 7
			return src.equals(AllowCodeConstant.Code.ALL);
		default:
			throw new ParamRuntimeException(AllowCodeConstant.Msg.CODE_ERROR);
		}
	}

	/**
	 * 判断是否有团队权限
	 * 
	 * @param src
	 *            TEAM源权限码
	 * @param desc
	 *            目标权限码
	 * @param role
	 *            授权角色
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年10月24日
	 */
	public static boolean hasTeamAllow(String src, String desc, AllowCodeConstant.TeamRole role) {
		// 获取角色对应的权限码单元，然后对比目标权限码
		return hasAllow(String.valueOf(src.charAt(role.getIndex())), desc);
	}
}
